package org.elanfox.cloud.mybatis.ddl.mapper;

import org.apache.ibatis.annotations.Param;
import org.elanfox.cloud.mybatis.ddl.dos.SchemaColumn;
import org.elanfox.cloud.mybatis.ddl.dos.SchemaTable;
import org.elanfox.cloud.mybatis.ddl.model.EntityColumn;
import org.elanfox.cloud.mybatis.ddl.model.EntityTable;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * 创建更新表结构的Mapper
 *
 * @author sunchenbin
 */
@Repository
public interface CreateMysqlTablesMapper {

    /**
     * 根据结构注解解析出来的信息创建表
     *
     * @param entityTable
     */
    void createTable(@Param("entityTable") EntityTable entityTable);

    /**
     * 删除表
     *
     * @param tableName
     */
    void dropTable(@Param("tableName") String tableName);

    /**
     * 根据表名查询表信息
     *
     * @param tableName
     * @return SysMysqlTable
     */
    SchemaTable findTableByTableName(@Param("tableName") String tableName);

    int countByTableName(@Param("tableName") String tableName);

    /**
     * 根据表名查询库中该表的字段结构等信息
     *
     * @param tableName 表结构的map
     * @return 表的字段结构等信息
     */
    List<SchemaColumn> findColumnsByTableName(@Param("tableName") String tableName);

    /**
     * 增加字段
     *
     * @param tableName
     * @param entityColumn
     */
    void addColumn(@Param("tableName") String tableName, @Param("column") EntityColumn entityColumn);

    /**
     * 删除字段
     *
     * @param tableName
     * @param columnName
     */
    void removeColumn(@Param("tableName") String tableName, @Param("columnName") String columnName);

    /**
     * 修改字段
     *
     * @param tableName
     * @param entityColumn
     */
    void modifyColumn(@Param("tableName") String tableName, @Param("column") EntityColumn entityColumn);

    /**
     * 修改并drop主键
     *
     * @param tableName
     * @param entityColumn
     */
    void modifyAndDropPrimaryKey(@Param("tableName") String tableName, @Param("column") EntityColumn entityColumn);

    /**
     * 删除某个表的主键索引
     *
     * @param tableName
     */
    void dropPrimaryKey(@Param("tableName") String tableName);

    void addPrimaryKey(@Param("tableName") String tableName, @Param("pkColumns") List<EntityColumn> pkColumns);
}
